cmp
cmp vleft, vright ;vleft-vright 결과값의 형태에 따라서 flag에 저장(compare insturction)
cmp |
vleft=vright |
vleft>vright |
vleft<vright |
ZF |
1 |
0 |
0 |
CF |
0 |
0 |
1 |
ZF(zero flag), CF(carry flag)
Branch instruction
jmp (SHORT, NEAR, FAR)
jmp L1 ;L1으로 무조건 분기(near 이 기본형임)
short jmp ;signed 1byte로 표기(-128-127byte 이동가능) 세그먼트 내에서
near jmp ;signed 2byte로 표기(appropriciate -32,000-32,000byte 이동가능) 세그먼트 내에서
far jmp ;다른 코드세그먼트로의 분기를 허용
JZ |
ZF가 세트 될 때 에만 분기 |
JNZ |
ZF가 언세트 될 때 에만 분기 |
JO |
OF가 세트 될 때 에만 분기 |
JNO |
OF가 언세트 될 때 에만 분기 |
JS |
SF가 세트 될 때 에만 분기 |
JNS |
SF가 언세트 될 때 에만 분기 |
JC |
CF가 세트 될 때 에만 분기 |
JNC |
CF가 언세트 될 때 에만 분기 |
JP |
PF가 세트 될 때 에만 분기 |
JNP |
PF가 언세트 될 때 에만 분기 |
if(EAX==0){
EBX=1;
}else{
EBX=2;
}
then make source file which activate same as above C/C++ in assembly
cmp eax, 0
jz thenblock
mov ebx, 2
jmp next
thenblock:
mov ebx, 1
next:
mov ebx, 2
if(EAX>=5){
EBX=1;
}else{
EBX=2;
}
make it again
cmp eax, 5
js signon
jo elseblock
jmp thenblock
signon:
jo thenblock
elseblock:
mov ebx, 2
jmp next
thenblock:
mov ebx, 1
next:
codes be significant difficult, for this problem 80x86 give us few instruction
SIGNED |
UNSIGNED |
JE
vleft = vright 이면 분기 |
JE vleft = vright 이면 분기 |
JNE
vleft != vright 이면 분기 |
JNE vleft != vright 이면 분기 |
JL, JNGE
vleft < vright 이면 분기 |
JB, JNAE |
JLE, JNG
vleft <= vright 이면 분기 |
JBE, JNA vleft <= vright 이면 분기 |
JG, JNLE
vleft > vright 이면 분기 |
JA, JNBE vleft > vright 이면 분기 |
JGE, JNL
vleft >= vright 이면 분기 |
JAE, JNB vleft >= vright 이면 분기 |
can make above assembly codes simly
cmp eax, 5
jge thenblock
mov ebx, 2
jmp next
thenblock:
mov ebx,1
next:
Loop instruction
Loop instruction is active similar with ‘for' in C/C++
LOOP ECX의 값을 감소시키고, ECX != 0이면 라벨로 분기한다.
LOOPE, LOOPZ ECX의 값을 감소시키고 (플래그 레지스터의 값은 바뀌지 않는다.) 만일 ECX != 0이고 ZF = 1 이면 분기한다.
LOOPNE, LOOPNZ ECX의 값을 감소시키고 (플래그 레지스터의 값은 바뀌지 않는다.) 만일 ECX != 0이고 ZF = 0 이면 분기한다.
sum=0;
for(i=10;i>0;i--){
sum+=i;
}
mov eax, 0
mov ecx, 10
loop_start:
add eax, ecx
loop loop_start
loop를 cmp와 jmp를 이용해서 구현할 수 있다.